// Literal Object che contiene metodi di utilità per le chiamate Ajax
var Ajax = 
{
    // Controlli sul browser, attraverso il metodo degli oggetti supportati
    browser : function () 
    {
        // Il browser è IE5+, Firefox 1+, Opera 7.05+
        var type = "unknow";
        if (document.getElementById) {
            type = "MOD";
        }
        // IE 6+
        if (document.all) {
            type += "_IE4+";
        }
        // OPERA
        if (window.opera) {
            type += "_OPERA";
        }
        return type;
    },
    /*
    * compatibilità fra browser per creare un oggetto XMlHttpRequest
    */
    createXMLHttpRequest : function () 
    {
        // Mozilla e Opera hanno l'oggetto XMLHttpRequest, che può esssere creato quindi con new
        if (typeof XMLHttpRequest != "undefined") {
            return new XMLHttpRequest();
        }
        // IE invece utilizza un ActiveXObject.
        else if (window.ActiveXObject) 
        {
            // array con tutte le versioni della libreria possibili, dalla più aggiornata alla più vecchia
            var aVersions = [ "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", 
            "Microsoft.XMLHttp" ];
            for ( var i = 0; i < aVersions.length; i++) 
            {
                try 
                {
                    // si cerca di cotruire l'oggetto con la versione più recente della libreria.
                    // se non si riesce, si passa alla versione meno recente.
                    var oXmlHttp = new ActiveXObject(aVersions[i]);
                    //alert(aVersions[i]);
                    return oXmlHttp;
                }
                catch (e) {
                    // Non crea niente
                }
            }
        }
        throw new Error("XMLHttp Object could not be created!!");
    },
    /*
    * crea e fa partire la richiesta vera e propria
    * @param url l'indirizzo da caricare
    * @param il content type della richiesta
    * @param callback la funzione da chiamere al termine della procedura con risultato corretto
    * @param stateFunctionArray un array di funzioni corrispondenti agli stati di cambiamento 
    * della richiesta XMLHttp (all'indice 0 dell'arrai c'è la gestione dell'errore)
    * @param postData i dati necesari nel caso di una richesta post, può anche essere nullo
    */
    makeRequest : function (url, contentType, callback, stateFunctionArray, postData) 
    {
        var req = Ajax.createXMLHttpRequest();
        if (!req) {
            return;
        }
        // se ho dei dati nella variabile postData, allora il metodo deve essere POST
        var method = (postData) ? "POST" : "GET";
        req.open(method, url, true);
        if (postData) {
            req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
            req.setRequestHeader("Content-length", postData.length);
			req.setRequestHeader("Connection", "close");
        }
        else {
            req.setRequestHeader("Content-type", contentType);
        }
        req.onreadystatechange = function () 
        {
            if (stateFunctionArray.length != 0) 
            {
                if (req.readyState == 1) {
                    stateFunctionArray[1]();
                }
                if (req.readyState == 4) 
                {
                    if (req.status == 200) {
                        callback(req.responseText);
                    }
                    if (req.status == 404) {
                        stateFunctionArray[0]();
                    }
                    if (req.status == 500) {
                        stateFunctionArray[0]();
                    }
                }
            }
        }
        req.send(postData);
    },
    /*
    * funzione di compatibilità fra browser per creare un documento XML
    */
    createDocument : function () 
    {
        // il processo di creazione è simile a quello eseguirto per la creazione
        // dell'oggetto XMLHttpRequest
        try {
            return document.implementation.createDocument("", "", null);
        }
        catch (e) 
        {
            var versions = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", 
            "MSXML2.DOMDocument", "Microsoft.XmlDom" ];
            for (var i = 0; i < versions.length; i++) 
            {
                //alert("tentativo con " + versions[i]);
                try {
                    var xmlDom = new ActiveXObject(versions[i]);
                    return xmlDom;
                }
                catch (er) {}
            }
            throw new Error("Documento non creato.");
        }
    },
    // replica la proprietà text di IE che ritorna il testo di un nodo e di tutti i suoi
    // successori. Proprietà assente negli altri browser
    getText : function (node) 
    {
        var sText = "";
        for (var i = 0; i < node.childNodes.length; i++) 
        {
            if (node.childNodes[i].hasChildNodes()) {
                sText += Ajax.getText(node.childNodes[i]);
            }
            else {
                sText += node.childNodes[i].nodeValue;
            }
        }
        return sText;
    },
    // controlla se Ajax è supportato dal Javascript engine del dispositivo
    isEnabled : function () 
    {
        try {
            Ajax.createDocument();
        }
        catch (err) {
            return false;
        }
        return true;
    }
};
